package com.letsgo;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.StringReader;
import java.io.StringWriter;
import java.net.URL;
import java.util.ArrayList;
import java.util.Date;
import java.util.LinkedList;
import java.util.List;

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;

import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.NameValuePair;
import org.apache.http.StatusLine;
import org.apache.http.client.ClientProtocolException;
import org.apache.http.client.HttpClient;
import org.apache.http.client.entity.UrlEncodedFormEntity;
import org.apache.http.client.methods.HttpDelete;
import org.apache.http.client.methods.HttpGet;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.entity.StringEntity;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.message.BasicNameValuePair;
import org.apache.http.params.HttpParams;
import org.apache.http.protocol.HTTP;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import org.xml.sax.InputSource;
import org.xml.sax.SAXException;
import org.xmlpull.v1.XmlSerializer;

import android.sax.RootElement;
import android.util.Xml;

public class WebRequester implements Requester {
	private Player currentOwner=null;
	private HttpClient httpClient;
	private static final String VERSION = "1.0";
	private String baseURL = "http://192.168.0.13:8081/";
	private static final String USERS = "users/";
	private static final String BOARDS = "boards/";
	private static final String REQUESTS = "requests/";
	private static final String MOVES = "moves/";
	private static final String INVITES = "invites/";
	private boolean versionOk = false;
	
	/**
	 * This method will done an HTTP Get request on the server configured into the variable baseURL
	 * The server will respond with an XML file with the current version of the server application
	 * and the baseUrl used currently.
	 * @param p is a Player object that represent the owner player information
	 * @throws ClientProtocolException
	 * @throws IOException
	 * @throws ParserConfigurationException
	 * @throws SAXException
	 */
	public WebRequester(Player p) throws ClientProtocolException, IOException, ParserConfigurationException, SAXException{
		currentOwner = p;
		httpClient = new DefaultHttpClient();
		HttpGet get = new HttpGet(baseURL+"?un="+currentOwner.getNick_name());
		HttpResponse response = httpClient.execute(get);
		
		StatusLine sl = response.getStatusLine();
		HttpEntity entity= response.getEntity();
		BufferedReader rd = new BufferedReader(new InputStreamReader(entity.getContent()));
		String line;
		String responseContent="";
		while ((line = rd.readLine()) != null) {
			responseContent = responseContent+line;
		}
		rd.close();
		
		DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
		DocumentBuilder db = dbf.newDocumentBuilder();			
		Document doc = db.parse(new InputSource(new BufferedReader(new StringReader(responseContent))));
		doc.getDocumentElement().normalize();
		Node fc = doc.getFirstChild();
		if(fc.getNodeName().equals("goimerir")){
			Element elmnt = (Element) fc;
			if(elmnt.getAttribute("version").equals(VERSION))
				versionOk=true;
		}
		if(versionOk){
			NodeList nodeList= doc.getElementsByTagName("url");
			for (int i = 0; i < nodeList.getLength(); i++) {
				Node node = nodeList.item(i);
				Element elmnt = (Element) node;
				baseURL = elmnt.getAttribute("href")+"/";
			}
		}
	}
	/**
	 * This method will make an XML String with different informations about the new Player p
	 * And will send the XML String in parameter of an HTTP Post request.
	 */
	@Override
	public void createUser(Player p) throws RequesterMissingPwdException {
		 XmlSerializer serializer = Xml.newSerializer();
		 StringWriter writer = new StringWriter();
		 try {
	        serializer.setOutput(writer);
	        serializer.startDocument("UTF-8", true);
	        serializer.startTag("", "goimerir");
	        serializer.attribute("", "version", "1.0");
	        serializer.startTag("", "user_create");
	        
	        serializer.startTag("", "fullname");
	        serializer.attribute("", "value", p.getName());
	        serializer.endTag("", "fullname");
	        
	        serializer.startTag("", "screenname");
	        serializer.attribute("", "value", p.getNick_name());
	        serializer.endTag("", "screenname");
	        
	        serializer.startTag("", "password");
	        serializer.attribute("", "value", p.getPwd());
	        serializer.endTag("", "password");
	        
	        serializer.endTag("", "user_create");
	        serializer.endTag("", "goimerir");
	        serializer.endDocument();
	        HttpPost post = new HttpPost(baseURL+USERS);// /users
	        StringEntity se = new StringEntity(writer.toString(),HTTP.UTF_8);
		    se.setContentType("text/xml");
		    post.setHeader("Content-Type","application/soap+xml;charset=UTF-8");
		    post.setEntity(se);
			HttpResponse response = httpClient.execute(post);
	        
	    } catch (Exception e) {
	        throw new RuntimeException(e);
	    }
	    
	}
	/**
 	 * This method will done an HTTP GET Resquest, taking the list of users between the start and the end variable.
 	 * When the list of users is returned from the server, if the header of the server is equals to the status code 200
 	 * then the function will extract the content message in our case it is an xml message and we will do an extraction from
	 * the XML of the differents values that we need to returned.
	 */
	@Override
	public ArrayList<Player> listUsers(int start, int end, boolean last) {
		if(versionOk){
			ArrayList<Player> listPlayer = new ArrayList<Player>();
			httpClient = new DefaultHttpClient();
			
			HttpGet get=null;
			if(last)
				get = new HttpGet(baseURL+USERS+"?start="+start+"&end="+end+"&last=1");
			else
				get = new HttpGet(baseURL+USERS+"?start="+start+"&end="+end+"&last=0");
			HttpResponse response;
			try {
				response = httpClient.execute(get);
				StatusLine sl = response.getStatusLine();
				/*
				 *  If the status code is correct we can take the content message
				 */
				if(sl.getStatusCode()==200){
					HttpEntity entity= response.getEntity();
					BufferedReader rd = new BufferedReader(new InputStreamReader(entity.getContent()));
					String line;
					String responseContent="";
					while ((line = rd.readLine()) != null) {
						responseContent = responseContent+line;
					}
					rd.close();
					/*
					 * Extraction of the differents informations from the XML
					 */
					DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
					DocumentBuilder db;
					try {
						db = dbf.newDocumentBuilder();
						Document doc;
						try {
							doc = db.parse(new InputSource(new BufferedReader(new StringReader(responseContent))));
							doc.getDocumentElement().normalize();
							Node fc = doc.getFirstChild();
							if(fc.getNodeName().equals("goimerir")){
								NodeList nodeList= doc.getElementsByTagName("user");
								for (int i = 0; i < nodeList.getLength(); i++) {
									Node node = nodeList.item(i);
									Element elmnt = (Element) node;
									listPlayer.add(new Player(elmnt.getAttribute("name"), elmnt.getAttribute("fullname"), "") );
								}
							}
						} catch (SAXException e) {
							// TODO Auto-generated catch block
							e.printStackTrace();
						}
					} catch (ParserConfigurationException e) {
						// TODO Auto-generated catch block
						e.printStackTrace();
					}			
				}
			} catch (ClientProtocolException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			} catch (IOException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
			
			
			return listPlayer;
		}else{return null;}
	}
	/**
	 * This method make an XML String with all information about the creation of a new game
	 * When is done, we send the XML String en parameter of the HTTP POST request.
	 * When the server response us, we checked if the status code is correct or not.
	 * If is not correct, we throw the good Exception from the status code recieve.
	 */
	@Override
	public void createGame(Game g) throws RequesterUnauthorizedException,
			RequesterUnsupportedMediaTypeException {
		 XmlSerializer serializer = Xml.newSerializer();
		 StringWriter writer = new StringWriter();
		 try {
	        serializer.setOutput(writer);
	        serializer.startDocument("UTF-8", true);
	        serializer.startTag("", "goimerir");
	        serializer.attribute("", "version", "1.0");
	        serializer.startTag("", "create_board");
	        
	        serializer.startTag("", "name");
	        serializer.attribute("", "value", ""+g.getId());
	        serializer.endTag("", "name");
	        
	        serializer.startTag("", "creation_date");
	        serializer.attribute("", "value", "");
	        serializer.endTag("", "creation_date");
	        
	        serializer.startTag("", "owner");
	        serializer.attribute("", "value", g.getOwner().getNick_name());
	        serializer.endTag("", "owner");
	        
	        if(g.getInvitee()!=null){
	        	serializer.startTag("", "invitee");
	        	serializer.attribute("", "value", g.getInvitee().getNick_name());
	        	serializer.endTag("", "invitee");
	        }
	        
	        serializer.startTag("", "status");
	        switch(g.getStatus()){
	        case OPEN:
	        	serializer.attribute("", "value", "OPEN");
	        	break;
	        case CLOSED:
	        	serializer.attribute("", "value", "CLOSE");
	        	break;
	        case FULL:
	        	serializer.attribute("", "value", "FULL");
	        	break;
	        }
	        serializer.endTag("", "status");
	        
	        serializer.startTag("", "size");
	        serializer.attribute("", "value", g.getSize()[0]+"x"+g.getSize()[1]);
	        serializer.endTag("", "size");
	        
	        serializer.startTag("", "owner_white");
	        if(g.isOwnerWhite())
	        	serializer.attribute("", "value","true");
	        else
	        	serializer.attribute("", "value","false");
	        serializer.endTag("", "owner_white");
	        
	        serializer.endTag("", "create_board");
	        serializer.endTag("", "goimerir");
	        serializer.endDocument();
	        
	        HttpPost post = new HttpPost(baseURL+BOARDS);// /boards
	        StringEntity se = new StringEntity(writer.toString(),HTTP.UTF_8);
		    se.setContentType("text/xml");
		    post.setHeader("Content-Type","application/soap+xml;charset=UTF-8");
		    post.setEntity(se);
			HttpResponse response = httpClient.execute(post);
			StatusLine sl = response.getStatusLine();
			switch( sl.getStatusCode() ){
				case 401:
					throw new RequesterUnauthorizedException();
				case 415:
					throw new RequesterUnsupportedMediaTypeException();
			}		
	    } catch (Exception e) {
	        throw new RuntimeException(e);
	    } 
	}
	/**
 	 * This method will done an HTTP GET Resquest, taking the list of Boards between the start and the end variable.
 	 * When the list of boards is returned from the server, if the header of the server is equals to the status code 200
 	 * then the function will extract the content message in our case it is an XML message and we will do an extraction from
	 * the XML of the differents values that we need to returned.
	 */
	@Override
	public ArrayList<Game> listGames(int start, int end, boolean last) {
		if(versionOk){
			ArrayList<Game> listGame = new ArrayList<Game>();
			httpClient = new DefaultHttpClient();
			HttpGet get=null;
			if(last)
				get = new HttpGet(baseURL+BOARDS+"?start="+start+"&end="+end+"&last=1");
			else
				get = new HttpGet(baseURL+BOARDS+"?start="+start+"&end="+end+"&last=0");
			HttpResponse response;
			try {
				response = httpClient.execute(get);
				StatusLine sl = response.getStatusLine();
				/*
				 *  If the status code is correct we can take the content message
				 */
				if(sl.getStatusCode()==200){
					HttpEntity entity= response.getEntity();
					BufferedReader rd = new BufferedReader(new InputStreamReader(entity.getContent()));
					String line;
					String responseContent="";
					while ((line = rd.readLine()) != null) {
						responseContent = responseContent+line;
					}
					rd.close();
					/*
					 * Extraction of the differents informations from the XML
					 */
					DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
					DocumentBuilder db;
					try {
						db = dbf.newDocumentBuilder();
						Document doc;
						try {
							doc = db.parse(new InputSource(new BufferedReader(new StringReader(responseContent))));
							doc.getDocumentElement().normalize();
							Node fc = doc.getFirstChild();
							if(fc.getNodeName().equals("goimerir")){
								NodeList nodeList= doc.getElementsByTagName("board");
								for (int i = 0; i < nodeList.getLength(); i++) {
									Node node = nodeList.item(i);
									Element elmnt = (Element) node;
									if(elmnt.getAttribute("status").equals("FULL")){
										try {
											listGame.add( new Game(new Integer(elmnt.getAttribute("name")), new Date(elmnt.getAttribute("creation_date")), new Player("",elmnt.getAttribute("owner"),""), new Player("",elmnt.getAttribute("invitee"),""), GAME_STATUS.FULL, true, new Board() ));
										} catch (NumberFormatException e2) {
											return null;
										} catch (GameNoRequesterSetException e2) {
											return null;
										}
									}
									else if(elmnt.getAttribute("status").equals("OPEN")){
										try {
											listGame.add( new Game(new Integer(elmnt.getAttribute("name")), new Date(elmnt.getAttribute("creation_date")), new Player("",elmnt.getAttribute("owner"),""), new Player("",elmnt.getAttribute("invitee"),""), GAME_STATUS.OPEN, true, new Board() ));
										} catch (NumberFormatException e1) {
											return null;
										} catch (GameNoRequesterSetException e1) {
											return null;
										}
									}
									else{
										try {
											listGame.add( new Game(new Integer(elmnt.getAttribute("name")), new Date(elmnt.getAttribute("creation_date")), new Player("",elmnt.getAttribute("owner"),""), new Player("",elmnt.getAttribute("invitee"),""), GAME_STATUS.CLOSED, true, new Board() ));
										} catch (NumberFormatException e) {
											// TODO Auto-generated catch block
											e.printStackTrace();
										} catch (GameNoRequesterSetException e) {
											// TODO Auto-generated catch block
											e.printStackTrace();
										}
									}
									//elmnt.getAttribute("name")
								}
							}
						} catch (SAXException e) {
							// TODO Auto-generated catch block
							e.printStackTrace();
						}
					} catch (ParserConfigurationException e) {
						// TODO Auto-generated catch block
						e.printStackTrace();
					}			
				}
			} catch (ClientProtocolException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			} catch (IOException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
			
			
			return listGame;
		}else{return null;}
	}
	/**
	 * This function is used to invite an user into a specific board.
	 * This method will created the XML file and send it with an HTTP POST request
	 * If the server return us an HTTP code ERROR then we handler it with the throw of differents exceptions.
	 */
	@Override
	public void inviteUser(Game g) throws RequesterUnauthorizedException,
			RequesterNotFoundException, RequesterUnsupportedMediaTypeException {
		XmlSerializer serializer = Xml.newSerializer();
		StringWriter writer = new StringWriter();
		try {
	        serializer.setOutput(writer);
	        serializer.startDocument("UTF-8", true);
	        serializer.startTag("", "goimerir");
	        serializer.attribute("", "version", "1.0");
	        serializer.startTag("", "create_invite");
	        
	        serializer.startTag("", "board");
	        serializer.attribute("", "name",""+g.getId());
	        serializer.endTag("", "board");
	        
	        serializer.endTag("", "create_invite");
	        serializer.endTag("", "goimerir");
	        serializer.endDocument();
	        
	        HttpPost post = new HttpPost(baseURL+USERS+g.getOwner().getNick_name()+"/"+INVITES);// users/[user]/invites/
	        StringEntity se = new StringEntity(writer.toString(),HTTP.UTF_8);
		    se.setContentType("text/xml");
		    post.setHeader("Content-Type","application/soap+xml;charset=UTF-8");
		    post.setEntity(se);
			HttpResponse response = httpClient.execute(post);
			StatusLine sl = response.getStatusLine();
			/*
			 * Check of the differents status codes
			 */
			switch( sl.getStatusCode() ){
				case 401:
					throw new RequesterUnauthorizedException();
				case 404:
					throw new RequesterNotFoundException();
				case 415:
					throw new RequesterUnsupportedMediaTypeException();
			}		
	    } catch (Exception e) {
	        throw new RuntimeException(e);
	    } 

	}
	/**
	 * This function is used to allow an user to join a board.
	 * This method will created the XML file and send it with an HTTP POST request
	 * If the server return us an HTTP code ERROR then we handler it with the throw of differents exceptions.
	 */
	@Override
	public void joinGame(Game g) throws RequesterUnauthorizedException,
			RequesterNotFoundException, RequesterUnsupportedMediaTypeException {
		XmlSerializer serializer = Xml.newSerializer();
		StringWriter writer = new StringWriter();
		try {
	        serializer.setOutput(writer);
	        serializer.startDocument("UTF-8", true);
	        serializer.startTag("", "goimerir");
	        serializer.attribute("", "version", "1.0");
	        serializer.startTag("", "create_board_request");
	        
	        serializer.startTag("", "sender");
	        serializer.attribute("", "name", currentOwner.getNick_name());
	        serializer.endTag("", "sender");
	        
	        serializer.endTag("", "create_board_request");
	        serializer.endTag("", "goimerir");
	        serializer.endDocument();
	        
	        HttpPost post = new HttpPost(baseURL+BOARDS+g.getId()+"/"+REQUESTS);
	        StringEntity se = new StringEntity(writer.toString(),HTTP.UTF_8);
		    se.setContentType("text/xml");
		    post.setHeader("Content-Type","application/soap+xml;charset=UTF-8");
		    post.setEntity(se);
			HttpResponse response = httpClient.execute(post);
			StatusLine sl = response.getStatusLine();
			/*
			 * Check of the differents status codes
			 */
			switch( sl.getStatusCode() ){
				case 401:
					throw new RequesterUnauthorizedException();
				case 404:
					throw new RequesterNotFoundException();
				case 415:
					throw new RequesterUnsupportedMediaTypeException();
			}		
	    } catch (Exception e) {
	        throw new RuntimeException(e);
	    } 
	}
	/**
	 * This method is used to delete an board on the server.
	 * To proccess, we create an HTTP DELETE request with the board id and
	 * send it on the server.
	 * If the server return us an HTTP ERROR then we handler it with the status code and throw the exception for each of them.
	 */
	@Override
	public void deleteGame(Game g) throws RequesterUnauthorizedException,
			RequesterForbiddenException, RequesterNotFoundException {
		if(versionOk){
			httpClient = new DefaultHttpClient();
			HttpDelete delete = new HttpDelete(baseURL+BOARDS+g.getId());
			HttpResponse response;
			try {
				response = httpClient.execute(delete);
				StatusLine sl = response.getStatusLine();
				/*
				 * Check of the differents status codes
				 */
				switch(sl.getStatusCode()){
					case 401:
						throw new RequesterUnauthorizedException();
					case 403:
						throw new RequesterForbiddenException();
					case 404:
						throw new RequesterNotFoundException();
				}
			} catch (ClientProtocolException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			} catch (IOException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}

	}
	/**
	 * This method is used to take all the informations about a special game
	 * To do that we send an HTTP GET request to the server and wait the response.
	 * When the server response us , we check if the status code is good.
	 * If the status code is good, we take the content message (XML DATA) and
	 * extract all the information that we need to make a new Game object.
	 * If the server return us an HTTP ERROR then we handler it with the status code and throw the exception for each of them.
	 */
	@Override
	public Game retrieveGame(Game g) throws RequesterNotFoundException {
		if(versionOk){
			Game gr=null;
			httpClient = new DefaultHttpClient();
			HttpGet get = new HttpGet(baseURL+BOARDS);
			HttpResponse response;
			try {
				response = httpClient.execute(get);
				StatusLine sl = response.getStatusLine();
				if(sl.getStatusCode()==404)
					throw new RequesterNotFoundException();
				if(sl.getStatusCode()==200){
					HttpEntity entity= response.getEntity();
					BufferedReader rd = new BufferedReader(new InputStreamReader(entity.getContent()));
					String line;
					String responseContent="";
					while ((line = rd.readLine()) != null) {
						responseContent = responseContent+line;
					}
					rd.close();
					
					DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
					DocumentBuilder db;
					try {
						db = dbf.newDocumentBuilder();
						Document doc;
						try {
							doc = db.parse(new InputSource(new BufferedReader(new StringReader(responseContent))));
							doc.getDocumentElement().normalize();
							Node fc = doc.getFirstChild();
							if(fc.getNodeName().equals("goimerir")){
								NodeList nodeList= doc.getElementsByTagName("board");
								for (int i = 0; i < nodeList.getLength(); i++) {
									Node node = nodeList.item(i);
									Element elmnt = (Element) node;
									Board b = new Board();
									ArrayList<BoardMovement> listMove = new ArrayList<BoardMovement>();
									NodeList nodeMoves= elmnt.getElementsByTagName("move");
									for (int j = 0; j < nodeMoves.getLength(); j++) {
										Node nodeMove = nodeMoves.item(j);
										Element elmntMove = (Element) nodeMove;
										listMove.add( new BoardMovement(new Integer(elmntMove.getAttribute("seq")), new Integer(elmntMove.getAttribute("row")), new Integer(elmntMove.getAttribute("column")))  );
									}
									try {
										b.fillFromHistory(listMove);
									} catch (BoardBadHistory e1) {
										// TODO Auto-generated catch block
										e1.printStackTrace();
									}
									NodeList nodeSize= elmnt.getElementsByTagName("size");
									for (int j = 0; j < nodeSize.getLength(); j++) {
										Node nodS= nodeSize.item(j);
										Element elmntS = (Element) nodS;
										if(elmntS.getAttribute("value").equals("9x9") ){
											b.setWidth(9);
											b.setHeight(9);
										}
										else if(elmntS.getAttribute("value").equals("13x13") ){
											b.setWidth(13);
											b.setHeight(13);
										}
										else if(elmntS.getAttribute("value").equals("19x19") ){
											b.setWidth(19);
											b.setHeight(19);
										}	
									}
									Boolean owner = false;
									NodeList nodeWhite= elmnt.getElementsByTagName("owner_white");
									for (int j = 0; j < nodeWhite.getLength(); j++) {
										Node nodS= nodeWhite.item(j);
										Element elmntS = (Element) nodS;
										if(elmntS.getAttribute("value").equals("true") )
											owner=true;
										else
											owner=false;
									}
									
									Player powner=null;
									Player pinvitee=null;
									Integer name=null;
									GAME_STATUS gs = GAME_STATUS.CLOSED;
									Date creation = null;
									NodeList nodeOwner= elmnt.getElementsByTagName("owner");
									for (int j = 0; j < nodeOwner.getLength(); j++) {
										Node nodS= nodeWhite.item(j);
										Element elmntS = (Element) nodS;
										powner = new Player("",elmntS.getAttribute("value"),"");
									}
									NodeList nodeCreation= elmnt.getElementsByTagName("creation_date");
									for (int j = 0; j < nodeCreation.getLength(); j++) {
										Node nodS= nodeWhite.item(j);
										Element elmntS = (Element) nodS;
										creation = new Date(elmntS.getAttribute("value"));
									}
									NodeList nodeInvitee= elmnt.getElementsByTagName("invitee");
									for (int j = 0; j < nodeInvitee.getLength(); j++) {
										Node nodS= nodeWhite.item(j);
										Element elmntS = (Element) nodS;
										pinvitee = new Player("",elmntS.getAttribute("value"),"");
									}
									NodeList nodeStatus= elmnt.getElementsByTagName("status");
									for (int j = 0; j < nodeStatus.getLength(); j++) {
										Node nodS= nodeWhite.item(j);
										Element elmntS = (Element) nodS;
										if(elmntS.getAttribute("value").equals("FULL"))
											gs = GAME_STATUS.FULL;
										else if(elmntS.getAttribute("value").equals("OPEN"))
											gs = GAME_STATUS.OPEN;
										else
											gs = GAME_STATUS.CLOSED;
									}
									NodeList nodeName= elmnt.getElementsByTagName("name");
									for (int j = 0; j < nodeName.getLength(); j++) {
										Node nodS= nodeWhite.item(j);
										Element elmntS = (Element) nodS;
										name = new Integer(elmntS.getAttribute("value"));
									}
									
									try {
											gr = new Game(name, creation, powner, pinvitee, gs, owner,b );
										} catch (NumberFormatException e) {
											// TODO Auto-generated catch block
											e.printStackTrace();
										} catch (GameNoRequesterSetException e) {
											// TODO Auto-generated catch block
											e.printStackTrace();
										}
									//elmnt.getAttribute("name")
								}
							}
						} catch (SAXException e) {
							// TODO Auto-generated catch block
							e.printStackTrace();
						}
					} catch (ParserConfigurationException e) {
						// TODO Auto-generated catch block
						e.printStackTrace();
					}			
				}
			} catch (ClientProtocolException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			} catch (IOException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
			return gr;
		}else{return null;}
	}
	/**
	 * This method take the game and the movement done by the player.
	 * To do that, we created an XML with the movement and send it on the server
	 * with an HTTP POST request.
	 * If the server return us an HTTP ERROR then we handler it with the status code and throw the exception for each of them.
	 */
	@Override
	public void playMove(Game g, BoardMovement b)
			throws RequesterUnauthorizedException, RequesterForbiddenException,
			RequesterNotFoundException {
		XmlSerializer serializer = Xml.newSerializer();
		StringWriter writer = new StringWriter();
		try {
	        serializer.setOutput(writer);
	        serializer.startDocument("UTF-8", true);
	        serializer.startTag("", "goimerir");
	        serializer.attribute("", "version", "1.0");
	        serializer.startTag("", "create_move");
	        
	        serializer.startTag("", "row");
	        serializer.attribute("", "value", ""+b.getRow());
	        serializer.endTag("", "row");
	        
	        serializer.startTag("", "column");
	        serializer.attribute("", "value", ""+b.getColumn());
	        serializer.endTag("", "column");
	        
	        serializer.endTag("", "create_move");
	        serializer.endTag("", "goimerir");
	        serializer.endDocument();
	        HttpPost post = new HttpPost(baseURL+BOARDS+g.getId()+"/"+MOVES);// boards/[board]/moves/
	        StringEntity se = new StringEntity(writer.toString(),HTTP.UTF_8);
		    se.setContentType("text/xml");
		    post.setHeader("Content-Type","application/soap+xml;charset=UTF-8");
		    post.setEntity(se);
			HttpResponse response = httpClient.execute(post);
			StatusLine sl = response.getStatusLine();
			/*
			 * Check of the differents status codes
			 */
			switch( sl.getStatusCode() ){
				case 401:
					throw new RequesterUnauthorizedException();
				case 403:
					throw new RequesterForbiddenException();
				case 404:
					throw new RequesterNotFoundException();
			}		
	    } catch (Exception e) {
	        throw new RuntimeException(e);
	    } 

	}
	/**
 	 * This method will done an HTTP GET Resquest, taking the list of moves from a board between the start and the end variable.
 	 * When the list of moves is returned from the server, if the header of the server is equals to the status code 200
 	 * then the function will extract the content message in our case it is an XML message and we will do an extraction from
	 * the XML of the differents values that we need to returned.
	 * If the status code is 404 we need to call an exception and stop the function.
	 */
	@Override
	public ArrayList<BoardMovement> moveHistory(Game g, int start, int end,
			boolean last) throws RequesterNotFoundException {
		if(versionOk){
			ArrayList<BoardMovement> listMove = new ArrayList<BoardMovement>();
			httpClient = new DefaultHttpClient();
			HttpGet get=null;
			if(last)
				get = new HttpGet(baseURL+BOARDS+g.getId()+"/"+MOVES+"?start="+start+"&end="+end+"&last=1");
			else
				get = new HttpGet(baseURL+BOARDS+g.getId()+"/"+MOVES+"?start="+start+"&end="+end+"&last=0");
			HttpResponse response;
			try {
				response = httpClient.execute(get);
				StatusLine sl = response.getStatusLine();
				if(sl.getStatusCode()==404)
					throw new RequesterNotFoundException();
				
				else if(sl.getStatusCode()==200){
					HttpEntity entity= response.getEntity();
					BufferedReader rd = new BufferedReader(new InputStreamReader(entity.getContent()));
					String line;
					String responseContent="";
					while ((line = rd.readLine()) != null) {
						responseContent = responseContent+line;
					}
					rd.close();
					
					DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
					DocumentBuilder db;
					try {
						db = dbf.newDocumentBuilder();
						Document doc;
						try {
							doc = db.parse(new InputSource(new BufferedReader(new StringReader(responseContent))));
							doc.getDocumentElement().normalize();
							Node fc = doc.getFirstChild();
							if(fc.getNodeName().equals("goimerir")){
								NodeList nodeList= doc.getElementsByTagName("moves");
								for (int i = 0; i < nodeList.getLength(); i++) {
									Node node = nodeList.item(i);
									Element elmnt = (Element) node;
									Board b = new Board();
									NodeList nodeMoves= elmnt.getElementsByTagName("move");
									for (int j = 0; j < nodeMoves.getLength(); j++) {
										Node nodeMove = nodeMoves.item(j);
										Element elmntMove = (Element) nodeMove;
										listMove.add( new BoardMovement(new Integer(elmntMove.getAttribute("seq")), new Integer(elmntMove.getAttribute("row")), new Integer(elmntMove.getAttribute("column")))  );
									}
								}
							}
						} catch (SAXException e) {
							// TODO Auto-generated catch block
							e.printStackTrace();
						}
					} catch (ParserConfigurationException e) {
						// TODO Auto-generated catch block
						e.printStackTrace();
					}			
				}
			} catch (ClientProtocolException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			} catch (IOException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
			return listMove;
		}else{return null;}
	}
	@Override
	public Player getOwner() {
		return currentOwner;
	}
	@Override
	public void setOwner(Player p) {
		currentOwner=p;
		
	}

}
